//
//  GCDUtil.h
//  EliveClient
//
//  Created by Pierce on 2017/8/9.
//  Copyright © 2017年 Pierce. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface GCDUtil : NSObject


/**
 确保block中的方法在程序中只执行一次
 
 @param block 要执行的方法
 */
+(void)gcd_runJustOnce:(dispatch_block_t)block;



/**
 在主线程中延迟秒数执行block中的方法
 
 @param delay 延迟的秒数
 @param block 要执行的方法
 */
+(void)gcd_runAfterDelay:(CGFloat)delay InMainQueue:(dispatch_block_t)block;



/**
 主线程中开启异步执行block中的方法，完成后回到主线程（主队列不会开启新的线程，一般与UI刷新显示有关）
 
 @param block 要执行的方法
 */
+(void)gcd_runInMainQueue:(dispatch_block_t)block;


/**
 
 多线程中开启异步执行block中的方法（全局队列可以开启新线程，一般耗时操作）
 
 @param block 要执行的方法
 */
+(void)gcd_runInGlobalQueue:(dispatch_block_t)block;


/**
 跑计时器执行事件
 
 @param time 跑计时器的总时长（如60s）
 @param duration 间隔时间 （如1s）
 @param durationTimeBlock 每间隔时间需要做的block中方法 (如每秒要做的事情)
 @param finalBlock 计时器完成时的block的方法 （计时器跑完要做的事情）
 */
+(void)gcd_runTimerTotalTime:(CGFloat)time  Duration:(CGFloat)duration DurationTimeBlock:(void(^)(int leftDuration))durationTimeBlock FinalTimeBlock:(dispatch_block_t)finalBlock;



/**
 开启多个子线程Blocks，都完成后执行finalBlock（子线程间用分号隔开）
 
 @param firstBlock 子线程之一的block（多个子block用“，”隔开）
 @param returnBlock 所有子线程拿到后的线程
 */
+(void)gcd_runReturnBlocks:(dispatch_block_t)returnBlock Blocks:(dispatch_block_t)firstBlock,...;


/**
 根据timerInterval和queue来启动一个计时器,eachBlock为每次触发的Block.(调用此方法需在对应控制器将GCDUtil变成属性，否者只执行一次)
 
 @param duration 计时器时间间隔
 @param queue 队列
 @param eachBlock 每间隔时间需要做的block中方法 (如每秒要做的事情)
 @return 根据timerInterval和queue来启动一个计时器,eachBlock为每次触发的Block.
 */
+(GCDUtil *)gcd_repeatRunDuration:(CGFloat)duration Queue:(dispatch_queue_t)queue EachBlock:(dispatch_block_t)eachBlock;

/**
 @abstract 取消计时器.
 **/
- (void)cancelRepeatSelector;


@end
